const INFINITY = 1 / 0 // 正无穷
const MAX_INTEGER = 1.7976931348623157e308 // 最大安全整数

function toFinite(value: number): number {
  // 转换为有限数值
  if (value === INFINITY || value === -INFINITY) {
    // 如果是正无穷或负无穷
    const sign = value < 0 ? -1 : 1
    return sign * MAX_INTEGER // 返回最大安全整数或其相反数
  }
  return value === value ? value : 0 // 如果是 NaN，则返回 0，否则返回原值
}

function baseRange(start: number, end: number, step: number): number[] {
  let index = -1
  let length = Math.max(Math.ceil((end - start) / (step || 1)), 0) // 计算数组长度Step如果有就是本身，没有就是1，防止除以0
  const result = new Array<number>(length) // 创建指定长度的数组

  while (length--) {
    // 生成范围数组
    result[++index] = start
    start += step
  }
  return result // 返回生成的范围数组
}

export default function range(start: number, end: number, step: number): number[] {
  // Ensure the sign of `-0` is preserved.
  start = toFinite(start) // 转换为有限数值
  if (end === undefined) {
    // 如果没有传入 end 参数，则将 start 赋值给 end，start 设为 0
    end = start
    start = 0 // 设为 0
  } else {
    end = toFinite(end) // 转换为有限数值
  }
  step = step === undefined ? (start < end ? 1 : -1) : toFinite(step) // 如果没有传入 step 参数，则根据 start 和 end 的大小关系设为 1 或 -1，否则转换为有限数值
  return baseRange(start, end, step) // 生成范围数组
}
